package com.gdones.gpt.core.util;

import cn.hutool.extra.pinyin.PinyinUtil;
import com.gdones.gpt.bus.innerCode.dto.InnerCodeDto;
import com.gdones.gpt.bus.innerCode.mapper.InnerCodeMapper;
import lombok.Data;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Date;

/**
 * 模块名称： 系统工具类
 * 模块类型：
 * 编码人：高靖博
 * 创建时间：2023/3/27
 * 联系电话：18587388612
 */
@Component
@Data
public class MySysUtil {


    @Autowired
    private InnerCodeMapper innerCodeMapper;

    private static MySysUtil mySysUtil;

    private MySysUtil(){}

    @PostConstruct
    public void init(){
        mySysUtil = this;
        mySysUtil.innerCodeMapper = this.innerCodeMapper;
    }
    /**
     *  生成innerCode方法
     * @param tableName 表名
     * @param keyName 主键字段名
     * @param parentID 要生成innerCode数据的父节点主键值
     * @return
     */
    public static String getInnerCode(String tableName,String keyName,String parentID){

        String newInnerCode = "";

        InnerCodeDto dto = new InnerCodeDto();

        dto.setTableName(tableName);
        dto.setKeyName(keyName);
        dto.setParentID(parentID);

        // 统计当前节点有多少数据
        String theInnerCode = mySysUtil.innerCodeMapper.countWithParentID(dto);

        int parentCont = 0;

        // 避免前序数据被删除，统计子节点数值生成innerCode出错
        if(theInnerCode!=null){
            String substring = theInnerCode.substring(theInnerCode.length() - 5, theInnerCode.length());

            int indexs = 0;
            for(int i=0;i<substring.length();i++){
                if(substring.charAt(i)!='0'){
                    indexs = i;
                    break;
                }
            }
            substring = substring.substring(indexs,substring.length());

            parentCont  = Integer.valueOf(substring);
        }


        if("-1".equals(parentID)){ // 如果parentID是-1的话描述的就是顶级节点
            newInnerCode = "";
        }else{ // 如果是子节点就需要拼接父节点 innerCode值
            String parentInnerCode = mySysUtil.innerCodeMapper.getParentInnerCode(dto); // 获取父级节点innerCode
            newInnerCode = parentInnerCode; // 先将父节点innerCode放入等待拼接
        }

        parentCont = parentCont +1; //

        if(parentCont>=0&parentCont<10){
            newInnerCode = newInnerCode +"0000"+ parentCont;
        }else if(parentCont>=10&parentCont<100){
            newInnerCode = newInnerCode +"000"+ parentCont;
        }else if(parentCont>=100&parentCont<1000){
            newInnerCode = newInnerCode +"00"+ parentCont;
        }else if(parentCont>=1000&parentCont<10000){
            newInnerCode = newInnerCode +"0"+ parentCont;
        }else if(parentCont>=10000&parentCont<100000){
            newInnerCode = newInnerCode + parentCont;
        }


        return newInnerCode;
    }


    /**
     * 生成编号方法
     * @param modelName 模块名，如员工就是：STAFF 用大写描述
     * @param name 参与生成编号的属性一般用姓名字段，会解析为拼音
     * @return
     */
    public static String generateCode(String modelName,String name){
        String names = PinyinUtil.getFirstLetter(name, "").toUpperCase();

        return modelName.toUpperCase()+"-"+names+(new Date().getTime());
    }

}
